<template>
    <div>
        {{ lastCar }}
    </div>
</template>

<script setup lang="ts">
/**
 * 实现一个通用Last<T>，它接受一个数组T并返回其最后一个元素的类型
 * T extends any[] 表示T是一个数组
 * infer表示在 extends 条件语句中待推断的类型变量
 * U表示推断的类型变量，它将用于表示数组的最后一个元素类型
 * [...infer _, infer U] 表示一个包含除最后一个元素外的所有元素的数组，最后一个元素被推断为U
 */

type Last<T extends any[]> = T extends [...infer _, infer U] ? U : never;

// 使用场景： 取数组的最后一个元素类型
type LastItemType = Last<[string, number, boolean]>; // 应该为boolean
type LastItemType2 = Last<[string, number]>; // 应该为number

type Cars = [number, boolean, string]
type LastCar = Last<Cars>

let lastCar = ref<LastCar>()

lastCar.value = 'Bmw'
</script>

<style scoped>

</style>